<?php

defined('BASEPATH') or die('forbidden');

/**
 * 视图基类
 * @author  Karson
 * @name    view.php
 * @since   2013-5-30 13:32:13
 */
class View {

    var $data = array();
    var $dir;
    var $suffix;

    function __construct() {
        $this->dir = VIEW_DIR;
        $this->suffix = VIEW_SUFFIX;
    }

    /**
     * 设置模板中显示的变量
     * @param mixed $key 变量名称或数组
     * @param mixed $value 变量值
     */
    function assign($key, $value = null) {
        if (!is_null($value) && !is_array($key)) {
            $this->data[$key] = $value;
        } else {
            if (is_array($key)) {
                foreach ($key as $k => $v) {
                    if (is_int($k)) {
                        $this->data[] = $v;
                    } else {
                        $this->data[$k] = $v;
                    }
                }
            }
        }
    }

    /**
     * 返回一个模板解析后的结果,不执行输出
     * @param string $name 模板文件名称
     * @param mixed $data 向模板传输的数据，默认为null
     * @return string 解析后的数据
     */
    function fetch($name, $data = null) {
        ob_start();
        $this->display($name, $data);
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
    }

    /**
     * 显示一个模板解析后的结果，执行输出
     * @param string $name 模板文件名称
     * @param mixed $data 向模板传输的数据，默认为null
     */
    function display($name, $data = null) {
        $file = $name . $this->suffix;
        $path = $this->dir . '/' . $file;
        if (!file_exists($path))
            throw new Exception("视图文件[{$file}]未找到");
        /* 把查询信息和调试及信息状态信息写入模板 */
        $framework = &get_instance('controller');
        $data['querycounts'] = $framework->db->querycounts;
        $data['debuginfo'] = $framework->db->debuginfo;
        $data['user'] = $framework->auth->fields;
        $data['version'] = $framework->config['version'];
        $data['config'] = $framework->config;
        $data['referer_url'] = $framework->input->server('HTTP_REFERER');
        $data['current_url'] = get_url();
        $data['current_time'] = time();
        return $this->_view($path, $data);
    }

    /**
     * 显示并解析模板
     * @param string $path 模板文件路径
     * @param mixed $data 向模板输出的数据，默认为null
     */
    function _view($path, $data = null) {
        extract($this->data);
        if (!empty($data))
            extract($data);
        include ($path);
    }

}
